package com.jojo.elementary.day6_string;

import java.util.HashMap;
import java.util.Map;

/**
 * 383、赎金信
 *
 * 给你两个字符串：ransomNote 和 magazine ，判断 ransomNote 能不能由 magazine 里面的字符构成。
 * 如果可以，返回 true ；否则返回 false 。
 * magazine 中的每个字符只能在 ransomNote 中使用一次。
 *
 * 示例 1：
 * 输入：ransomNote = "a", magazine = "b"
 * 输出：false
 *
 * 示例 2：
 * 输入：ransomNote = "aa", magazine = "ab"
 * 输出：false
 * 示例 3：
 *
 * 输入：ransomNote = "aa", magazine = "aab"
 * 输出：true
 *
 */
public class RansomLetter {

    /** myCode 使用hash表存储magazine字符串中各字符的数量，然后比对是否能组成*/
    public boolean canConstruct(String ransomNote, String magazine) {
        Map<Character,Integer> magMap = new HashMap<>();

        for (int i =0;i < magazine.length();i++){
            char ch = magazine.charAt(i);
            magMap.put(ch,magMap.getOrDefault(ch,0) + 1);
        }

        for (int i =0;i < ransomNote.length();i++){
            char ch = ransomNote.charAt(i);
            if (magMap.getOrDefault(ch,0) == 0){
                return false;
            }else{
                magMap.put(ch,magMap.get(ch) - 1);
            }
        }
        return true;
    }

    /** pe. 使用ascll码 */
    public boolean canConstruct2(String ransomNote, String magazine) {
        int[] arr = new int[26];
        for (int i = 0; i < magazine.length(); i++)
            arr[magazine.charAt(i) - 'a']++;
        for (int i = 0; i < ransomNote.length(); i++)
            if (arr[ransomNote.charAt(i) - 'a']-- == 0) return false;
        return true;
    }

    public static void main(String[] args) {
        RansomLetter letter = new RansomLetter();
        String ran = "abccdo";
        String mag = "afjjcasbdbnccfhk";
        System.out.println(letter.canConstruct(ran,mag));
    }
}
